#INCLUDE "PROTHEUS.CH"
#INCLUDE "HEADERGD.CH"

/*
+-------------------------+-------------------------------------------+----------------------+
|Funcao: ChamEve          |Ghandy						          		    | Data: 01/07/2013     |
+-------------------------+-------------------------------------------+----------------------+
|Descricao: Funcao para fazer consulta em chamados e eventos do chamado					         |
+--------------------------------------------------------------------------------------------+
|Uso: Modulo Gestao de Servicos - Consultar registro das tabelas ZZJ e ZZM - Chamado Sitema  |
|	   Jupiter Mobile                                                                        	|
+--------------------------------------------------------------------------------------------+
|                     ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO INICIAL.                      |
+-------------------------+------------+-----------------------------------------------------+
|Programador              |   Data     |             Motivo da Alteracao                     |
+-------------------------+------------+-----------------------------------------------------+
|                         |   /  /     |                                                     |
+-------------------------+------------+-----------------------------------------------------+
*/

User Function ChamEve()

	Private cCadastro	:= "Consulta Eventos do Chamado"
	
	Private aRotina 	:= MenuDef()
	
	mBrowse( 6 , 1 , 22 , 75 , "ZZJ" )
	
Return( NIL )

/*/
	Funcao:		MenuDef
	Autor:		Marinaldo de Jesus
	Descricao:	Opcoes do Menu aRotina
	Uso:		Generico
/*/
Static Function MenuDef()
Return(;
			{;
				{ "Pesquisar"	,	"AxPesqui"  										  				, 0 , 1 ,0  , .F. },;
				{ "Visualizar"	,	"StaticCall(u_ChamEve,ChaMnt,'ZZJ',ZZJ->(Recno()),2)" , 0 , 2 ,0  , NIL } ;
			}; 
		)
/*				{ "Incluir"		,	"StaticCall(u_Mod3Ex1,Ex1Mnt,'ZZJ',ZZJ->(Recno()),3)" , 0 , 3 ,0  , NIL },;
				{ "Alterar"		,	"StaticCall(u_Mod3Ex1,Ex1Mnt,'ZZJ',ZZJ->(Recno()),4)" , 0 , 4 ,15 , NIL },;
				{ "Excluir"		,	"StaticCall(u_Mod3Ex1,Ex1Mnt,'ZZJ',ZZJ->(Recno()),5)" , 0 , 5 ,16 , NIL } ;
			}; 
		)
*/
/*/
	Funcao:		Ex1Mnt
	Autor:		Marinaldo de Jesus
	Descricao:	Rotina de Manutencao do Exemplo da Modelo3
	Uso:		Generico
/*/
Static Function ChaMnt( cAlias , nReg , nOpc )

	Local aZZJCols		:= {}
	Local aSvZZJCols	:= {}
	Local aZZJHeader	:= {}
	Local aZZJFields	:= {}
	Local aZZJVirtEn	:= {}
	Local aZZJVisuEn	:= {}
	Local aZZJNotFields	:= {}
	Local aZZJAltera	:= {}
	Local aZZJNaoAlt	:= {}
	Local aZZJRecnos	:= {}
	Local aZZJKeys		:= {}

	Local aZZMKeys
	Local aZZMVirtGd
	Local aZZMVisuGd
	Local aZZMNotFields	:= { }
//	gHANDY EM 01/07/13 Local aZZMNotFields	:= { "FC_TES" }
	Local aZZMRecnos
	Local aSvZZMCols

	Local bGetZZJ
	Local bGetZZM

	Local cZZJFil		:= ""
	Local cZZJCodigo	:= ""
	Local cZZMKeySeek

	Local lMod3Ret		:= .F.
	Local lLocks		:= .F.
	Local lExecLock		:= ( ( nOpc <> 2 ) /*/Visualizacao/*/ .and. ( nOpc <> 3 ) /*/Inclusao/*/ )

	Local nLoop			:= 0
	Local nOpcGD		:= nOPC
	Local nZZJUsado		:= 0
	Local nZZMUsado		:= 0
	Local nZZMOrder		:= RetOrder( "ZZM" , "ZM_FILIAL+ZM_CHAMADO+ZM_CODEVE+STR(ZM_ORDEM)" )

	Private aCols		:= {}
	Private aHeader		:= {}

	Private aGets
	Private aTela

	Private n			:= 1

	BEGIN SEQUENCE

		aRotSetOpc( cAlias , @nReg , nOpc )

		bGetZZJ			:= { |lLock,lExclu|	IF( lExecLock , ( lLock := .T. , lExclu	:= .T. ) , aZZJKeys := NIL ),;
											aZZJCols := ZZJ->(;
									  							GdBuildCols(	@aZZJHeader		,;	//01 -> Array com os Campos do Cabecalho da GetDados
																				@nZZJUsado		,;	//02 -> Numero de Campos em Uso
																				@aZZJVirtEn		,;	//03 -> [@]Array com os Campos Virtuais
																				@aZZJVisuEn		,;	//04 -> [@]Array com os Campos Visuais
																				"ZZJ"			,;	//05 -> Opcional, Alias do Arquivo Carga dos Itens do aCols
																				aZZJNotFields	,;	//06 -> Opcional, Campos que nao Deverao constar no aHeader
																				@aZZJRecnos		,;	//07 -> [@]Array unidimensional contendo os Recnos
																				"ZZJ"		   	,;	//08 -> Alias do Arquivo Pai
																				NIL				,;	//09 -> Chave para o Posicionamento no Alias Filho
																				NIL				,;	//10 -> Bloco para condicao de Loop While
																				NIL				,;	//11 -> Bloco para Skip no Loop While
																				NIL				,;	//12 -> Se Havera o Elemento de Delecao no aCols 
																				NIL				,;	//13 -> Se Sera considerado o Inicializador Padrao
																				NIL				,;	//14 -> Opcional, Carregar Todos os Campos
																				NIL				,;	//15 -> Opcional, Nao Carregar os Campos Virtuais
																				NIL				,;	//16 -> Opcional, Utilizacao de Query para Selecao de Dados
																				NIL				,;	//17 -> Opcional, Se deve Executar bKey  ( Apenas Quando TOP )
																				NIL				,;	//18 -> Opcional, Se deve Executar bSkip ( Apenas Quando TOP )
																				NIL				,;	//19 -> Carregar Coluna Fantasma
																				NIL				,;	//20 -> Inverte a Condicao de aNotFields carregando apenas os campos ai definidos
																				NIL				,;	//21 -> Verifica se Deve Checar se o campo eh usado
																				NIL				,;	//22 -> Verifica se Deve Checar o nivel do usuario
																				NIL				,;	//23 -> Verifica se Deve Carregar o Elemento Vazio no aCols
																				@aZZJKeys		,;	//24 -> [@]Array que contera as chaves conforme recnos
																				@lLock			,;	//25 -> [@]Se devera efetuar o Lock dos Registros
																				@lExclu			 ;	//26 -> [@]Se devera obter a Exclusividade nas chaves dos registros
																		    );
															  ),;
											IF( lExecLock , ( lLock .and. lExclu ) , .T. );
		  					} 
	
	    IF !( lLocks := WhileNoLock( "ZZJ" , NIL , NIL , 1 , 1 , .T. , 1 , 5 , bGetZZJ ) )
			Break
		EndIF

		MkArrEdFlds( nOpc , aZZJHeader , aZZJVisuEn , aZZJVirtEn , @aZZJNaoAlt , @aZZJAltera , @aZZJFields )

   		For nLoop := 1 To nZZJUsado
   			SetMemVar( aZZJHeader[ nLoop , __AHEADER_FIELD__ ] , aZZJCols[ 01 , nLoop ] , .T. )
   		Next nLoop

		cZZJFil		:= ZZJ->ZJ_FILIAL
		cZZJCodigo	:= ZZJ->ZJ_NUM
		cZZMKeySeek	:= cZZJFil+cZZJCodigo

		ZZM->( dbSetOrder( nZZMOrder ) )

		ZZM->( dbSeek( cZZMKeySeek , .F. ) )

		bGetZZM	:= { |lLock,lExclu|	IF( lExecLock , ( lLock := .T. , lExclu := .T. ) , aZZMKeys := NIL ),;
						 				aCols := ZZM->(;
														GdBuildCols(	@aHeader		,;	//01 -> Array com os Campos do Cabecalho da GetDados
																		@nZZMUsado		,;	//02 -> Numero de Campos em Uso
																		@aZZMVirtGd		,;	//03 -> [@]Array com os Campos Virtuais
																		@aZZMVisuGd		,;	//04 -> [@]Array com os Campos Visuais
																		"ZZM"				,;	//05 -> Opcional, Alias do Arquivo Carga dos Itens do aCols
																		aZZMNotFields	,;	//06 -> Opcional, Campos que nao Deverao constar no aHeader
																		@aZZMRecnos		,;	//07 -> [@]Array unidimensional contendo os Recnos
																		"ZZJ"		   	,;	//08 -> Alias do Arquivo Pai
																		cZZMKeySeek		,;	//09 -> Chave para o Posicionamento no Alias Filho
																		NIL				,;	//10 -> Bloco para condicao de Loop While
																		NIL				,;	//11 -> Bloco para Skip no Loop While
																		NIL				,;	//12 -> Se Havera o Elemento de Delecao no aCols 
																		NIL				,;	//13 -> Se Sera considerado o Inicializador Padrao
																		NIL				,;	//14 -> Opcional, Carregar Todos os Campos
																		NIL				,;	//15 -> Opcional, Nao Carregar os Campos Virtuais
																		NIL				,;	//16 -> Opcional, Utilizacao de Query para Selecao de Dados
																		.F.				,;	//17 -> Opcional, Se deve Executar bKey  ( Apenas Quando TOP )
																		.F.				,;	//18 -> Opcional, Se deve Executar bSkip ( Apenas Quando TOP )
																		NIL				,;	//19 -> Carregar Coluna Fantasma e/ou BitMap ( Logico ou Array )
																		NIL				,;	//20 -> Inverte a Condicao de aNotFields carregando apenas os campos ai definidos
																		NIL				,;	//21 -> Verifica se Deve Checar se o campo eh usado
																		NIL				,;	//22 -> Verifica se Deve Checar o nivel do usuario
																		NIL				,;	//23 -> Verifica se Deve Carregar o Elemento Vazio no aCols
																		@aZZMKeys		,;	//24 -> [@]Array que contera as chaves conforme recnos
																		@lLock			,;	//25 -> [@]Se devera efetuar o Lock dos Registros
																		@lExclu			,;	//26 -> [@]Se devera obter a Exclusividade nas chaves dos registros
																		1				,;	//27 -> Numero maximo de Locks a ser efetuado
																		Altera			 ;	//28 -> Utiliza Numeracao na GhostCol
																    );
														  ),;
										IF( lExecLock , ( lLock .and. lExclu ) , .T. );
		  		    }

	    IF !( lLocks := WhileNoLock( "ZZM" , NIL , NIL , 1 , 1 , .T. , 1 , 5 , bGetZZM ) )
			Break
		EndIF

		IF ( nOpc == 3  ) //Inclusao
			GdDefault( NIL , "ZZJ" , aZZJHeader , @aZZJCols , NIL , .F. )
		EndIF

		aSvZZJCols	:= aClone( aZZJCols )
		aSvZZMCols	:= aClone( aCols )

		lMod3Ret	:=	Modelo3(;
									cCadastro						,;	//cTitulo
									"ZZJ"		  						,;	//cAlias1
									"ZZM"								,;	//cAlias2
									@aZZJFields						,;	//aMyEncho/
									"StaticCall(u_ChamEve,Mod3Lok)"	,;	//cLinOk
									"StaticCall(u_ChamEve,Mod3Tok)"	,;	//cTudoOk
									nOpc							,;	//nOpcE
									nOpcGD							,;	//nOpcG,
									NIL								,;	//cFieldOk,
									.T.								,;	//lVirtual
									999								,;	//nLinhas
									aZZJAltera						,;	//aAltEnchoice
									NIL								,;	//nFreeze,
									NIL								,;	//aButtons
									NIL								,;	//aCordW
									NIL								 ;	//nSizeHeader
								)
	
		IF ( lMod3Ret )
	 		IF ( nOpc != 2 )
				MsAguarde(;
							{ ||;
									Mod3Ex1Grv(;
													@nOpc		,;	//01 -> Opcao de Acordo com aRotina
								 					@nReg		,;	//02 -> Numero do Registro do Arquivo Pai ( ZZM )
								 					@aZZJHeader	,;	//03 -> Campos do Arquivo Pai ( ZZJ )
								 					@aZZJVirtEn	,;	//04 -> Campos Virtuais do Arquivo Pai ( ZZJ )
								 					@aZZJCols	,;	//05 -> Conteudo Atual dos Campos do Arquivo Pai ( ZZJ )
								 					@aSvZZJCols	,;	//06 -> Conteudo Anterior dos Campos do Arquivo Pai ( ZZJ )
								 					@aHeader	,;	//07 -> Campos do Arquivo Filho ( ZZM )
								 					@aCols		,;	//08 -> Itens Atual do Arquivo Filho ( ZZM )
								 					@aSvZZMCols	,;	//09 -> Itens Anterior do Arquivo Filho ( ZZM )
								 					@aZZMVirtGd	,;	//10 -> Campos Virtuais do Arquivo Filho ( ZZM )
								 					@aZZMRecnos	 ;	//11 -> Recnos do Arquivo Filho ( ZZM )
								 				 );
							};
						  )
			EndIF
		EndIF

	END SEQUENCE

	FreeLocks( "ZZM" , aZZMRecnos , .T. , aZZMKeys )
	FreeLocks( "ZZJ" , aZZJRecnos , .T. , aZZJKeys )
	
Return( NIL )

/*/
	Funcao:		Mod3Lok
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao para Validacao da Linha Ok da GetDados
	Uso:		Generico
/*/
Static Function Mod3Lok()

	Local lLinOk  		:= .T.
	
	Local aCposKey

	Begin Sequence

		IF !( GdDeleted() )
			aCposKey := GdObrigat( aHeader )
			IF !( lLinOk := GdNoEmpty( aCposKey ) )
		    	Break
			EndIF
			aCposKey := GetArrUniqe( "ZZM" )
			IF !( lLinOk := GdCheckKey( aCposKey , 4 ) )
				Break
			EndIF
		EndIF

	End Sequence

Return( lLinOk )

/*/
	Funcao:		Mod3Tok
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao Para Validacao do TudoOk da GetDados
	Uso:		Generico
/*/
Static Function Mod3Tok()

	Local lTudoOk		:= .T.
	
	Local nLoop
	Local nLoops
	Local nDeleted

	IF ( Type( "n" ) <> "N" )
		Private n := 0
	EndIF
	
	Begin Sequence
	
		nDeleted := GdFieldPos( "GDDELETED" )
		
		nLoops := Len( aCols )
		For nLoop := 1 To nLoops
			n := nLoop
			IF !( aCols[ n , nDeleted ] )
				IF !( lTudoOk := Mod3Lok() )
					Break
				EndIF
			EndIF
		Next nLoop
	
	End Sequence

Return( lTudoOk  )

/*/
	Funcao:		Mod3Ex1Grv
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao para Gravacao/Exclusao das Informacoes se TudoOk
	Uso:		Generico
/*/
Static Function Mod3Ex1Grv(	nOpc			,;	//01 -> Opcao de Acordo com aRotina
						  				nReg			,;	//02 -> Numero do Registro do Arquivo Pai ( ZZJ )
									 	aZZJHeader	,;	//03 -> Campos do Arquivo Pai ( ZZJ )
									 	aZZJVirtEn	,;	//04 -> Campos Virtuais do Arquivo Pai ( ZZJ )
									 	aZZJCols		,;	//05 -> Conteudo Atual dos Campos do Arquivo Pai ( ZZJ )
									 	aSvZZJCols	,;	//06 -> Conteudo Anterior dos Campos do Arquivo Pai ( ZZJ )
									 	aZZMHeader	,;	//07 -> Campos do Arquivo Filho ( ZZM )
									 	aZZMCols		,;	//08 -> Itens Atual do Arquivo Filho ( ZZM )
									 	aSvZZMCols	,;	//09 -> Itens Anterior do Arquivo Filho ( ZZM )
									 	aZZMVirtGd	,;	//10 -> Campos Virtuais do Arquivo Filho ( ZZM )
									 	aZZMRecnos	 ;	//11 -> Recnos do Arquivo Filho ( ZZM )
								  )

	Local aMestre	:= GdPutIStrMestre( 01 )
	Local aItens	:= {}
	Local cOpcao	:= IF( ( nOpc == 5 ) , "DELETE" , IF( ( ( nOpc == 3 ) .or. ( nOpc == 4 ) ) , "PUT" , NIL ) )
	Local cZZJCodigo	:= GetMemVar( "ZJ_NUM" )
	Local lAllModif	:= .F.
	Local lZZJModif	:= .F.
	Local lZZMModif	:= .F.
	Local lZZMDelet	:= .F.
	
	Local aZZMColDel
	Local aZZMRecDel
	
	Local nLoop
	Local nLoops
	Local nItens

	IF ( cOpcao == "DELETE" )
		GdSuperDel( aZZMHeader , @aZZMCols , NIL , .T. )
		lZZJModif := .T.
	EndIF

	IF ( lZZMModif := !ArrayCompare( aZZMCols , aSvZZMCols ) )
		IF ( cOpcao <> "DELETE" )
			GdSuperDel( aZZMHeader , @aZZMCols , NIL , .T. , GdGetBlock( "ZZM" , aZZMHeader , .F. ) ) 
		EndIF	
		lZZMDelet := GdSplitDel( aZZMHeader , @aZZMCols , @aZZMRecnos , @aZZMColDel , @aZZMRecDel )
	EndIF

	IF ( lZZMModif )

		IF ( lZZMDelet )

			aAdd( aItens , GdPutIStrItens() )
			nItens := Len( aItens )

			aItens[ nItens , 01 ] := "ZZM"
			aItens[ nItens , 02 ] := NIL
			aItens[ nItens , 03 ] := aClone( aZZMHeader )
			aItens[ nItens , 04 ] := aClone( aZZMColDel )
			aItens[ nItens , 05 ] := aClone( aZZMVirtGd )
			aItens[ nItens , 06 ] := aClone( aZZMRecDel )
			aItens[ nItens , 07 ] := {}
			aItens[ nItens , 08 ] := NIL
			aItens[ nItens , 09 ] := NIL
			aItens[ nItens , 10 ] := ""

		EndIF

		aAdd( aItens , GdPutIStrItens() )
		nItens := Len( aItens )
		aItens[ nItens , 01 ] := "ZZM"
		aItens[ nItens , 02 ] := {;
									{ "FILIAL"	, xFilial( "ZZM" , xFilial( "ZZJ" ) ) },;
									{ "TES"		, cZZJCodigo };
							 	 }
		aItens[ nItens , 03 ] := aClone( aZZMHeader )
		aItens[ nItens , 04 ] := aClone( aZZMCols   )
		aItens[ nItens , 05 ] := aClone( aZZMVirtGd )
		aItens[ nItens , 06 ] := aClone( aZZMRecnos )
		aItens[ nItens , 07 ] := {}
		aItens[ nItens , 08 ] := NIL
		aItens[ nItens , 09 ] := NIL
		aItens[ nItens , 10 ] := ""

	EndIF

	IF !( lZZJModif )
		nLoops := Len( aZZJHeader )
		For nLoop := 1 To nLoops
			aZZJCols[ 01 , nLoop ] := GetMemVar( aZZJHeader[ nLoop , 02 ] )
		Next nLoop
		lZZJModif := !( ArrayCompare( aZZJCols , aSvZZJCols ) )
	EndIF

 	lAllModif := ( ( lZZMModif ) .or. ( lZZJModif ) )

	IF ( lAllModif )

		aMestre[ 01 , 01 ]	:= "ZZJ"
		aMestre[ 01 , 02 ]	:= nReg
		aMestre[ 01 , 03 ]	:= lZZJModif
		aMestre[ 01 , 04 ]	:= aClone( aZZJHeader )
		aMestre[ 01 , 05 ]	:= aClone( aZZJVirtEn )
		aMestre[ 01 , 06 ]	:= {}
		aMestre[ 01 , 07 ]	:= aClone( aItens )
		aMestre[ 01 , 08 ]	:= ""

		GdPutInfoData( aMestre , cOpcao , .F. , .F. )

		IF ( cOpcao <> "DELETE" )
			ZZM->( FkCommit() )
			ZZJ->( FkCommit() )
		Else
			ZZJ->( FkCommit() )
			ZZM->( FkCommit() )
		EndIF

	EndIF

Return( NIL )		